home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCMania 73
/
PCMania CD73_1.iso
/
pcmania
/
render73
/
Taller
/
PRUEBA1.POV
< prev
next >
Wrap
Text File
|
1998-10-06
|
16KB
|
349 lines
/* ESta es la tabla de paneles rectangulares
panelR2x2_2y4
panelR2x2_2y4y4
panelR2x2_ventana10
panelR2x2_ventana11
panelR3x1_2y4 panelR3x2_2y4
panelR3x1_2y4y16 panelR3x2_2y4y16
panelR3x1_2y4y32 panelR3x2_2y4y32
panelR3x1_puerta10 panelR3x2_2y4y16y32
panelR3x1_puerta11 panelR3x2_puerta10
panelR3x1_ventana10 panelR3x2_puerta11
panelR3x1_ventana11 panelR3x2_puerta12
panelR3x2_puerta13
panelR3x2_ventana10
panelR3x2_ventana11
panelR3x2_ventana12
panelR3x2_ventana13
panelR4x1_2y4 panelR4x2_2y4 panelR4x3_2y4
panelR4x1_puerta10 panelR4x2_2y4y4 panelR4x3_2y4y4
panelR4x1_puerta11 panelR4x2_2y4y16 panelR4x3_2y4y16
panelR4x1_ventana10 panelR4x2_2y4y32 panelR4x3_2y4y32
panelR4x1_ventana11 panelR4x2_2y4y16y32 panelR4x3_2y4y16y32
panelR4x2_ventana20 panelR4x3_puerta20
fin de la lista */
#include "colors.inc"
camera { //prueba 1 de camara para portada
location <400, 900, -1450>
direction <0.0, 0.0, 1>
up <0.0, 1.0, 0.0>
right <1.33,0.0, 0.0>
look_at <200,200,0>
//orthographic
}
light_source {<-50000,60000,-50000> color White}
light_source {<30000,40000,-50000> color White}
#declare madera1=texture{pigment{Brown}}
#declare madera2=texture{pigment{rgb<1,.7,.2>}}
#declare madera3=texture{pigment{rgb<9,.5,.05>}}
#declare piedra1=texture{pigment{Cyan}}
#declare piedra2=texture{pigment{Cyan}}
#declare pared=texture{pigment{Orange}}
#declare cristal1=texture{pigment{Maroon}}
#declare hierro1=texture{pigment{Blue}}
#declare hierro2=texture{pigment{Green}}
#include "castlib1.inc"
#declare R=seed(1645);
//#declare R=seed(11645);
//#declare R=seed(14226);
/*el siguiente array guarda una lista de series. El primer indice es el numero de estilo y los elementos apuntados
por el segundo indice son campos del registro del estilo indicado en el primer indice. Dentro de este registro, el
primer campo indica el numero de series que que definen el estilo, el siguiente indica (si no es 255), que serie
debe ser utilizada obligatoriamente para el primer piso y los campos restantes son series que pueden ser utilizadas
en los pisos superiores (y tambien en el primero, si el segundo campo no =255).
*/
#declare lista_estilos=array[1][10]{
{1,255,0,0,0,0,0,0,0,0}
}
/* el siguiente array guarda los paneles segun series cuyos elementos forman un estilo dado; hay
series que dan preferencia a las puertas de piedra, otras a las de madera, otras a las zonas en
blanco, etc */
#declare serie_paneles=array[1][15]
// aqui se guarda el ancho de cada panel de cada serie
#declare ancho_paneles=array[1][15]{
{100,200,100,100,100,100,100,100,0,0,0,0,0,0,0}
}
/*el primer elemento de cada par guarda el numero total de paneles de la serie, el segundo el punto
de la misma donde comienzan las ventanas y el tercero el punto donde comienzan las puertas (el
indice 0 siempre son vigas). El cuarto guarda los flags de datos de la serie que se organizan
como sigue:
128=no deben generarse puertas si no estamos en el primer piso
64=si se permiten puertas, se pondran siempre balcones. De lo contrario puede colocarse una
escalera si la altura total no excede de 8
Por ·ltimo, el 5 campo guarda la altura en Y de cada serie
*/
#declare datos_series=array[1][5]{
{6,4,5,128,300}
}
/*RUSTICA1 (paneles de 3 alto, predominio de 1 de ancho, puertas y ventanas madera, con ancho 2 no
hay adornos) */
#declare serie_paneles[0][0]=panelR3x1_2y4
#declare serie_paneles[0][1]=panelR3x2_2y4
#declare serie_paneles[0][2]=panelR3x1_2y4y16
#declare serie_paneles[0][3]=panelR3x1_2y4y32
#declare serie_paneles[0][4]=panelR3x1_ventana11
#declare serie_paneles[0][5]=panelR3x1_puerta10
//#declare serie_paneles[0][6]=panelR3x1_puerta11
#declare muro=array[100] //array global con los datos devueltos por la macro pared
#local a=0;
#while(a<100)
#declare muro[a]=0;
#local a=a+1;
#end
//Esta macro devuelve el numero aleatorio de un panel del ancho escogido dentro de la serie
//el tercer parametro se usa para excluir puertas o puertas y ventanas, si asi lo deseamos
#macro EscogePanel(serie, ancho, limite)
#local num_panel=int(rand(R)*limite);
#while (ancho_paneles[serie][num_panel]!=ancho)
#warning concat("num_panel ",str(num_panel,0,0)," ancho= ",
str(ancho_paneles[serie][num_panel],0,0)," ")
#local num_panel=num_panel+1;
#if (num_panel>limite) #local num_panel=0; #end
#end
num_panel
#end
//esta macro escoge los paneles para el muro en curso
#macro CreaMuro(limite_largo_muro, npiso, serie)
#local contador_largo_muro=0; //inicializamos contador de longitud del muro
#local ancho=0;
#local num_panel=0; //numero de panel en curso
#local numero_paneles=datos_series[serie][0]; //num. paneles de la serie
#local limite=0; //esta variable se usa como limite para el Rand
#local ventanas=datos_series[serie][2]; //aqui empiezan las ventanas de la serie
#local puertas=datos_series[serie][2]; //aqui empiezan las puertas de la serie
#local flags=datos_series[serie][3];
#local distancia_ultima_puerta=255; //si = 255, aun no se ha colocado ninguna puerta
// en primer lugar comprobamos si las puertas estan permitidas o no
#if (datos_series[serie][3]>=128 & npiso>0)
#local limite=puertas;
#else
#local limite=numero_paneles;
#end
#local elemento=0;
#while (contador_largo_muro<limite_largo_muro)
#if (limite_largo_muro - contador_largo_muro = 100)
// el primer elemento de la serie siempre tiene un largo de 1
#declare muro[elemento]=0;
#local contador_largo_muro=contador_largo_muro+100;
#else
#local num_panel=int(rand(R)*limite);
#if (limite_largo_muro - contador_largo_muro < ancho_paneles[serie][num_panel])
// el segundo elemento de la serie siempre tiene un largo de 2
#declare muro[elemento]=1;
#local contador_largo_muro=contador_largo_muro+200;
#else
/*Si se permite colocar puertas y rand ha devuelto un panel con puertas, se llega aqui. Y aqui, si aun no
se ha colocado ninguna puerta o si la distancia entre la nueva y la ·ltima es mayor de 600, entonces se
permite poner una puerta. */
#if(num_panel>=puertas)
#if(distancia_ultima_puerta=255 | ((distancia_ultima_puerta!=255)
& (contador_largo_muro - distancia_ultima_puerta > 600)))
#local distancia_ultima_puerta=contador_largo_muro;
#else
//De lo contrario se fuerza la colocaci≤n de un panel de ancho 1 de la serie, excluyendo los de puertas
#declare num_panel=EscogePanel(serie, 100, puertas);
#end
#end
#declare muro[elemento]=num_panel;
#local ancho=ancho_paneles[serie][num_panel];
#local contador_largo_muro=contador_largo_muro + ancho;
#end
#end
#local elemento=elemento+1;
#end
#declare muro[elemento]=255; //marca de fin de pared
#end
/*
//devuelve la altura del panel que vamos a emplear para el piso en curso
#macro determinar_altura(altura, suelo)
#if (altura-suelo=3 || altura-suelo=6) altura=3
#else #if (altura-suelo>=8) altura
*/
/*Esta pov-macro es la encargada de construir las casas. Estas seran generadas segun los
valores que se pasan a la macro en sus parametros. Las variables de la serie move guardan
valores para trasladar a la casa a lo largo de los ejes a los que referencian. Y los demas...
estilo: Se usa para determinar el tipo de paneles que se emplean en la casa.
anchura: Anchura en metros en X
Largo: Profundidad en el eje Z (la altura exacta no es relevante y siempre empleamos pisos de 4 y 3
metros de altura)
npisos: Num. de pisos de la casa
Lados: Desde cualquier punto de vista unicamente podremos ver dos lados de cualquier casa. Por tanto
usamos esta variable para indicar los lados que son visibles. Los otros no se construyen. (Los
lados visibles se determinan dependiendo de la posici≤n de la casa con respecto a la camara).
Si +128=lado +Z visible, de lo contrario vemos el +Z y si +64 entonces vemos el lado +X, de lo
contrario veremos el otro. (Ver el lado -Z, significa que, por ejemplo, estamos en -5Z y miramos
hacia Z=0).
puertas: Se usa para indicar los lados de la casa donde iran las puertas y cuantas habra.
Salientes: Indica si la casa tendra salientes y donde estaran estos
colgantes: Idem. en el caso de las estructuras colgantes.
La pov-macro utiliza el array bidimensional citymap para determinar el espacio de que disponen
las casas y evitar que estas se superpongan y tambien para averiguar las zonas de suelo sobre
las que se pueden poner habitantes */
#macro MakeHouse(estilo, anchura, largo, npisos, lados)
/* puertas, salientes, colgantes, moveX, moveY, moveZ) */
//#macro MakeHouse(estilo)
#local baseY=0; //Contador de altura. La base del piso actual
#local cpiso=0; //comenzamos con el primer piso
#local var1=0; //variable local multiproposito
#local var2=0; //otra mas
#local altura=0; //la altura del primer piso es 0
#while(cpiso<npisos)
#if(cpiso=0 & lista_estilos[estilo][1]!=255)
#local serie=lista_estilos[estilo][1];
#else
//escogemos aleatoriamente alguna de las series del estilo de la casa
#local var1=lista_estilos[estilo][0];
#local var2=int(rand(R*var1));
#local serie=lista_estilos[estilo][var2+2];
// #warning concat("serie ",str(serie,0,0)," valor rand= ", str(var2,0,0))
#end
#local tlado=lados; //var. temporal que guarda los lados visibles de la casa
#local pos_X=0; //inicializar contador posicional
#local elem=0; //contador para muro
CreaMuro(anchura, cpiso, serie)
union{
#while( muro[elem]!=255)
object{serie_paneles[estilo][muro[elem]] translate<pos_X,altura,0>}
#local pos_X=pos_X+ancho_paneles[estilo][muro[elem]];
#local elem=elem+1;
#end
#if (tlado>64) rotate y*180 translate<anchura,0,largo> #local tlado=tlado-128 #end
}
#local pos_X=0; //inicializar contador posicional
#local elem=0;
CreaMuro(largo, cpiso, estilo)
union{
#while( muro[elem]!=255)
object{serie_paneles[estilo][muro[elem]] translate<pos_X,altura,0>}
#local pos_X=pos_X+ancho_paneles[estilo][muro[elem]];
#local elem=elem+1;
#end
#if (tlado>32)
rotate y*-90 translate<anchura,0,0>
#else
rotate y*90 translate<0,0,largo>
#end
}
#local cpiso=cpiso+1;
//para el siguiente piso, colocamos los paneles a la altura adecuada
#local altura=altura+datos_series[serie][4];
#end
/*ya se han creado los pisos, el siguiente paso es crear el tejado y el panel visible (como en el caso de
los pisos, lo no visible no se dibuja. El panel visible es, por supuesto, el que acompa±a al panel Z visible */
// union{MakeTejado(anchura, largo, lados) translate<0,altura,0>}
#end
/*Aqui sigue la macro que construye los tejados. Emplea las siguientes estructuras
//ESTRUCTURAS PARA TEJADOS DE 26.625 grados
//paredes para tejados con esa inclinación
paredT4x2_completa_izq paredT4x2_completa_der
paredT4x2_ventana_izq paredT4x2_ventana_der
//picos de tejados de ese tipo
pico_tejado_4x2
pico_tejado_4x2_ventana1
pico_tejado_4x2_ventana2
//los tejados con 26.625 grados de inclinación
tejado26_izq_3metros tejado26_der_3metros
tejado26_izq_3metros_final tejado26_der_3metros_final
tejado26_izq_4decim tejado26_der_4decim
tejado26_izq_4decim_final tejado26_der_4decim_final
tejado26_izq_2metros tejado26_der_2metros
tejado26_izq_2metros_final tejado26_der_2metros_final
//ESTRUCTURAS PARA TEJADOS DE 45 grados
//paredes
paredT4x4_completa_izq paredT4x4_completa_der
paredT4x4_puerta_izq paredT4x4_puerta_der
//tejados
tejado45_izq_3metros tejado45_der_3metros
tejado45_izq_3metros_final tejado45_der_3metros_final
tejado45_izq_4decim tejado45_der_4decim
tejado45_izq_4decim_final tejado45_der_4decim_final
tejado45_izq_2metros tejado45_der_2metros
tejado45_izq_2metros_final tejado45_der_2metros_final
//los picos
pico_tejado_4x4
pico_tejado_4x4_puerta1
pico_tejado_4x4_puerta2 */
#macro MakeTejado(anchura, largo, lados)
/*lo primero es decidir que tipo de tejado se va a emplear, si el de 26 o el de 45 grados.
Si el edificio tiene un ancho frontal superior a 10 metros usaremos las piezas de 45 */
#warning concat("anchura ",str(anchura,0,0),"\n")
#if(anchura<=1000)
/*los algoritmos para crear tejado dependen del ancho del mismo debido a las "pocas"
piezas definidas */
#switch(anchura)
#case (600)
#warning concat("pase por aqui \n")
object{paredT4x2_completa_izq}
object{panelR4x2_2y4 translate<200,0,0>}
object{viga4x1_2 translate<400,0,0>}
object{paredT4x2_completa_der translate<200,0,0>}
object{paredT4x2_completa_izq translate<100,200,0>}
object{paredT4x2_completa_der translate<100,200,0>}
#break
#end
#end
#end
/* #if (lados>64) rotate y*180 translate<anchura,0,largo> #local tlado=tlado-128 #end */
//EXPERIMENTOS
/*
union{MakeHouse(0, 600, 800, 3, 64)
texture{pared}
} */
object{escalera_80Yx105Z_triple
texture{pared}
}
plane{z,0 pigment{checker color Red, color Yellow} scale<100,100,100> translate<0,0,20>}
plane{y,0 pigment{checker color Red, color Yellow} scale<100,100,100>}